home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / program / misc / smalltlk.lha / Smalltalk3.09 / src / unixio.c < prev   
C/C++ Source or Header  |  1995-08-26  |  4KB  |  203 lines

  1. /*
  2.     Little Smalltalk, version 2
  3.  
  4.     Unix specific input and output routines
  5.     written by tim budd, January 1988
  6. */
  7. # include <stdio.h>
  8. # include "env.h"
  9. # include "memory.h"
  10. # include "names.h"
  11.  
  12. # define DISPMETHOD false
  13.  
  14. struct {
  15.     int di;
  16.     object cl;
  17.     short ds;
  18.     } dummyObject;
  19.  
  20. /*
  21.     imageRead - read in an object image
  22.         we toss out the free lists built initially,
  23.         reconstruct the linkages, then rebuild the free
  24.         lists around the new objects.
  25.         The only objects with nonzero reference counts
  26.         will be those reachable from either symbols
  27. */
  28. static int fr(fp, p, s)
  29. FILE *fp;
  30. char *p;
  31. int s;
  32. {    int r;
  33.  
  34.     r = fread(p, s, 1, fp);
  35.     if (r && (r != 1))
  36.         sysError("imageRead count error","");
  37.     return r;
  38. }
  39.  
  40. noreturn imageRead(fp)
  41. FILE *fp;
  42. {    short i, size;
  43.     object *mBlockAlloc();
  44.  
  45.     ignore fr(fp, (char *) &symbols, sizeof(object));
  46.     i = 0;
  47.  
  48.     while(fr(fp, (char *) &dummyObject, sizeof(dummyObject))) {
  49.         i = dummyObject.di;
  50.         
  51.         if ((i < 0) || (i > ObjectTableMax))
  52.             sysError("reading index out of range","");
  53.         objectTable[i].class = dummyObject.cl;
  54.         if ((objectTable[i].class < 0) || 
  55.             ((objectTable[i].class>>1) > ObjectTableMax)) {
  56.             fprintf(stderr,"index %d\n", dummyObject.cl);
  57.             sysError("class out of range","imageRead");
  58.             }
  59.         objectTable[i].size = size = dummyObject.ds;
  60.         if (size < 0) size = ((- size) + 1) / 2;
  61.         if (size != 0) {
  62.             objectTable[i].memory = mBlockAlloc((int) size);
  63.             ignore fr(fp, (char *) objectTable[i].memory,
  64.                 sizeof(object) * (int) size);
  65.                 }
  66.         else
  67.             objectTable[i].memory = (object *) 0;
  68.         }
  69.  
  70.     /* now restore ref counts, getting rid of unneeded junk */
  71.     visit(symbols);
  72.     /* toss out the old free lists, build new ones */
  73.     setFreeLists();
  74.     
  75. }
  76.  
  77. /*
  78.     imageWrite - write out an object image
  79. */
  80.  
  81. static fw(fp, p, s)
  82. FILE *fp;
  83. char *p;
  84. int  s;
  85. {
  86.     if (fwrite(p, s, 1, fp) != 1) {
  87.         sysError("imageWrite size error","");
  88.         }
  89. }
  90.  
  91. noreturn imageWrite(fp)
  92. FILE *fp;
  93. {    short i, size;
  94.  
  95.     fw(fp, (char *) &symbols, sizeof(object));
  96.  
  97.     for (i = 0; i < ObjectTableMax; i++) {
  98.         if (objectTable[i].referenceCount > 0) {
  99.             dummyObject.di = i;
  100.             dummyObject.cl = objectTable[i].class;
  101.             dummyObject.ds = size = objectTable[i].size;
  102.             fw(fp, (char *) &dummyObject, sizeof(dummyObject));
  103.             if (size < 0) size = ((- size) + 1) / 2;
  104.             if (size != 0)
  105.                 fw(fp, (char *) objectTable[i].memory,
  106.                     sizeof(object) * size);
  107.             }
  108.         }
  109. }
  110.  
  111. /* i/o primitives - necessarily rather UNIX dependent;
  112.     basically, files are all kept in a large array.
  113.     File operations then just give an index into this array 
  114. */
  115. # define MAXFILES 20
  116. /* we assume this is initialized to NULL */
  117. static FILE *fp[MAXFILES];
  118.  
  119. object ioPrimitive(number, arguments)
  120. int number;
  121. object *arguments;
  122. {    int i, j;
  123.     char *p, buffer[1024];
  124.     object returnedObject;
  125.  
  126.     returnedObject = nilobj;
  127.  
  128.     i = intValue(arguments[0]);
  129.  
  130.     switch(number) {
  131.         case 0:        /* file open */
  132.             i = intValue(arguments[0]);
  133.             p = charPtr(arguments[1]);
  134.             if (streq(p, "stdin")) 
  135.                 fp[i] = stdin;
  136.             else if (streq(p, "stdout"))
  137.                 fp[i] = stdout;
  138.             else if (streq(p, "stderr"))
  139.                 fp[i] = stderr;
  140.             else {
  141.                 fp[i] = fopen(p, charPtr(arguments[2]));
  142.                 }
  143.             if (fp[i] == NULL)
  144.                 returnedObject = nilobj;
  145.             else
  146.                 returnedObject = newInteger(i);
  147.             break;
  148.  
  149.         case 1:        /* file close - recover slot */
  150.             if (fp[i]) ignore fclose(fp[i]);
  151.             fp[i] = NULL;
  152.             break;
  153.  
  154.         case 2:        /* file size */
  155.         case 3:        /* file in */
  156.             if (fp[i]) fileIn(fp[i], DISPMETHOD);
  157.             break;
  158.  
  159.         case 4:        /* get character */
  160.             sysError("file operation not implemented yet","");
  161.  
  162.         case 5:        /* get string */
  163.             if (! fp[i]) break;
  164.             j = 0; buffer[j] = '\0';
  165.             while (1) {
  166.                if (fgets(&buffer[j], 512, fp[i]) == NULL)
  167.                   return(nilobj); /* end of file */
  168.                if (fp[i] == stdin) {
  169.                 /* delete the newline */
  170.                 j = strlen(buffer);
  171.                 if (buffer[j-1] == '\n')
  172.                     buffer[j-1] = '\0';
  173.                 }
  174.                j = strlen(buffer)-1;
  175.                if (buffer[j] != '\\')
  176.                   break;
  177.                /* else we loop again */
  178.             }
  179.             returnedObject = newStString(buffer);
  180.             break;
  181.  
  182.         case 7:        /* write an object image */
  183.             if (fp[i]) imageWrite(fp[i]);
  184.             returnedObject = trueobj;
  185.             break;
  186.  
  187.         case 8:        /* print no return */
  188.         case 9:        /* print string */
  189.             if (! fp[i]) break; 
  190.             ignore fputs(charPtr(arguments[1]), fp[i]);
  191.             if (number == 8)
  192.                 ignore fflush(fp[i]);
  193.             else
  194.                 ignore fputc('\n', fp[i]);
  195.             break;
  196.  
  197.         default:
  198.             sysError("unknown primitive","filePrimitive");
  199.         }
  200.  
  201.     return(returnedObject);
  202. }
  203.